# coding=utf-8
from tkinter import messagebox, Tk, StringVar, Button, Menu, Label, Canvas, IntVar, ttk
import psutil
from PIL import ImageTk, Image
from shutil import copyfile
from os import system, path, remove, getcwd, mkdir, startfile
import configparser
import logging
import requests
from wmi import WMI
from ctypes import windll

def check_dir(dirs):
    if not path.isdir(dirs):
        try:
            mkdir(dirs)
        except IOError:
            messagebox.showerror(title='文件夹创建', message='无法创建文件夹[ %s ]' % dirs)
log_dir = getcwd() + '\log'
log_file = log_dir + '\Logs.ini'
config_dir = getcwd() + '\config'
check_dir(dirs=log_dir)
check_dir(dirs=config_dir)

logger = logging.getLogger()
logger.setLevel('DEBUG')
BASIC_FORMAT = "%(asctime)s :%(levelname)s :%(message)s"
DATE_FORMAT = '%Y-%m-%d %H:%M:%S'
formatter = logging.Formatter(BASIC_FORMAT, DATE_FORMAT)
fhlr = logging.FileHandler(log_file)  # 输出到文件的handler
fhlr.setFormatter(formatter)
logger.addHandler(fhlr)
logger.info('打开主程序')


#管理员权限判断
def is_admin():
    try:
        return windll.shell32.IsUserAnAdmin()
    except:
        return False
if is_admin():
    logging.info('当前已通过管理员运行')
else:
    logging.error('权限不足，请通过管理员权限运行此程序')
    messagebox.showerror(title='权限不足', message='请通过管理员重新运行此程序')
    exit('权限不足')

#####开始检测/生成配置文件
init_config_str_programme = str("""####----------------部分参数解析
#[Intranet]        这个不能改,反正别改完事了,如果改了[ ](所有）里面的内容就会报错,别问为啥，问就是我技术不行

[Intranet]
name=内网
IP=172.31.0.127
GATEWAY=172.31.0.254
GatewayCostMetric=1
NETMASK=255.255.255.0
DNS1=172.31.0.254
DNS2=119.29.29.29



[Extranet]
name=外网
IP=10.0.9.123
GATEWAY=10.0.9.254
GatewayCostMetric=1
NETMASK=255.255.255.0
DNS1=119.29.29.29
DNS2=114.114.114.114


[customize1]
name=网络1
IP=10.1.0.11
GATEWAY=10.1.0.254
GatewayCostMetric=1
NETMASK=255.255.255.0
DNS1=119.29.29.29
DNS2=114.114.114.114

[customize2]
name=网络2
IP=10.2.0.11
GATEWAY=10.2.0.254
GatewayCostMetric=1
NETMASK=255.255.255.0
DNS1=119.29.29.29
DNS2=114.114.114.114
""")
init_config_str_ping = str("""
[ping]
#地址
IPADDR=baidu.com
#持续ping(-t选项)
continued=n
#按钮名称
name=百度
""")

#初始化功能
class init_config:
    def __init__(self):
        self.dir = getcwd() + '\config'
        self.log = getcwd() + '\log'
        dir = [self.dir, self.log]
        for i in dir:
            if not path.isdir(i):
                try:
                    mkdir(self.dir)
                    logger.info(f"文件夹[ {i} ]创建成功")
                except IOError:
                    info = f"文件夹[ {i} ]创建失败，建议使用管理员运行"
                    logger.info(info)
                    messagebox.showerror(title='程序初始化', message=info)
    def get_size(self, file):
        """
        获取一个文件的占用存储信息
        :param file: 文件路径
        :return: 返回文件大小
        """
        size = path.getsize(file)
        mb = size / 1024 / 1024
        return mb
    def get_Net_list(self):
        """返回IP与网卡的对应关系(列表)"""
        net_info = psutil.net_if_addrs()
        ipv4_list = []
        net_list = {}
        id = int(0)
        for card in net_info:
            if card != '蓝牙网络连接' and card != 'Loopback Pseudo-Interface 1':  #从结果剔除两个名称的网卡
                id = id + int(1)  #ID递增+1
                snicList = net_info[card]
                for snic in snicList:
                    if snic.family.name == 'AF_INET':
                        ipv4 = snic.address
                        ipv4_list.append(ipv4)
                        net_list.update({id: {card: ipv4}})
        if len(ipv4_list) >= 1:
            logger.info('获取网卡信息成功')
            return net_list
        else:
            messagebox.showerror(title='获取网卡', message='获取网卡信息失败,请查看日志获取帮助')
            logger.error('网卡信息获取失败，请检查网卡名称是否设置为: 蓝牙网络连接、Loopback Pseudo-Interface 1,如果是请改名')
            return 'None'

    def logs(self):
        file = self.log + '\Logs.ini'
        try:
            f = open(file, 'w+', encoding='utf-8')
            f.write('')
            f.close()
            logger.info('清空日志成功')
            messagebox.showinfo(title='重置日志', message='重置日志成功')
        except IOError:
            messagebox.showerror(title='重置日志', message='重置日志失败,请查看日志')
            logger.error(f'请手动删除文件--->[ {file} ]')

    def programme(self, text, file, name):
        """
        初始化按钮、方案、ping
        :param text: 配置文件内容(str)
        :param file: 需要操作的文件
        :param name: 任务名称
        :return: 返回一个文件路径
        """
        file = self.dir + file
        if not path.isfile(file):
            try:
                # 写入方案参数
                rw_menu = open(file, 'w', encoding='utf-8')
                rw_menu.write(text)
                rw_menu.close()
                logger.info(f'{name}初始化成功')
            except IOError:
                messagebox.showinfo(title=f'{name}初始化', message='初始化失败，请重新运行')
                logger.error(f'{name}初始化失败')
        return file
    def check(self, file, name, mode=None):
        """
        检测配置文件
        :param file: 检测的文件
        :param n: sections数
        :return:
        """
        init = init_config()
        init.programme(text=init_config_str_programme, file='\programme.ini', name='方案配置检查')
        init.programme(text=init_config_str_ping, file='\ping.ini', name='ping配置检查')
        ##开始检测配置文件
        config = configparser.ConfigParser()
        config.read(file, encoding="utf-8")
        bt_list = []
        for u in config.sections():
            bt_list.append(u)
        if mode:
            if mode == 'init':
                remove(file)
                try:
                    # 写入按钮参数
                    rw_bt = open(file, 'w', encoding='utf-8')
                    rw_bt.write(init_config_str_programme)
                    rw_bt.close()
                    ##添加按钮
                    bt = Buttons(windows=Windows)
                    # 添加功能按钮
                    bt.fun()
                    messagebox.showinfo(title='按钮初始化成功', message=file)
                    logger.info('按钮初始化成功')
                except IOError:
                    messagebox.showerror(title='按钮初始化失败', message=file)
                    logger.info('按钮初始化失败')
            elif mode == 'update':
                if name == '刷新方案':
                    add_com.add_pr()
                elif name == '刷新ping':
                    add_com.add_ping()

            messagebox.showinfo(title=name, message=f'[ {name} ]成功')
    def get_images(self, url, file, name):
        """
        从互联网获取背景图片
        :param url: 图片URL
        :param file: 将图片保存为(例如: bg.jpg)
        :param name: 这个图片的类型(例如:背景)
        :return:
        """
        try:
            image_get = requests.get(url)
            image_get.raise_for_status()
            image_get.encoding = image_get.encoding
            with open(file, 'wb') as f:
                f.write(image_get.content)
                f.close()
            logger.info('%s获取成功' %name)
            return int(0)
        except IOError:
            messagebox.showerror(f'请联网获取[ {name} ..')
            logger.error(f'[ {name} ]获取失败,请将一个jpg图片命名为[ {file} ],然后放到程序目录下的[ config ]文件夹下')

#开始初始化配置文件
init = init_config()
pr_file = init.programme(text=init_config_str_programme, file='\programme.ini', name='方案') #初始化方案文件
ping_file = init.programme(text=init_config_str_ping, file='\ping.ini', name='PING') #初始化ping文件
card_file = config_dir + '\card_list.ini' #保存网卡信息文件
log_size = float(init.get_size(file=log_file))
if log_size >= 1:
    remove(log_size)
    logger.info('日志文件大于1MB,已清除旧记录')

#读取ini配置文件信息
class read_ini():
    def __init__(self, file=ping_file, section='ping'):
        """
        初始化读取的文件和section
        :param file: 文件对象
        :param section: 需要读取的section
        """
        self.file = file
        self.section = section
    def gets(self, name='name'):
        """
        通过传入变量名获取变量值
        :param name: 变量名
        :return: 变量值
        """
        get_conf = configparser.ConfigParser()
        get_conf.read(self.file, encoding="utf-8")
        config = get_conf.get(self.section, name)
        return config

"""
开始创建程序窗口
"""
Windows = Tk()


# 设置宽、高、左、上
Windows.geometry('600x374+400+200')
Windows.title('IP易换')

#设置图标、背景
def ico():
    #获取背景
    bg = "./config/item.jpg"
    if not path.isfile(bg):
        init.get_images(url='https://gitee.com/faith01238/IP/attach_files/602527/download/item.jpg', file=bg, name='背景图')
    if path.isfile(bg):
        image = Image.open(bg)
        im = ImageTk.PhotoImage(image)
        canvas = Canvas(Windows, width=600,  # 指定Canvas组件的宽度
                                height=384,  # 指定Canvas组件的高度
                                bg='white')  # 指定Canvas组件的背景色
        canvas.create_image(300, 300, image=im)  # 使用create_image将图片添加到Canvas组件中
        canvas.create_text(160, 20,  # 使用create_text方法在坐标（160是横坐标，20是纵坐标）处绘制文字
                           text='选择一个网卡',  # 所绘制文字的内容
                           fill='blue')  # 所绘制文字的颜色为灰色
        canvas.create_text(160, 60,  # 使用create_text方法在坐标（160是横坐标，60是纵坐标）处绘制文字
                           text='选择一个方案',  # 所绘制文字的内容
                           fill='blue')  # 所绘制文字的颜色为灰色
        canvas.create_text(160, 100,  # 使用create_text方法在坐标（160是横坐标，60是纵坐标）处绘制文字
                           text='选择一个模式',  # 所绘制文字的内容
                           fill='blue')  # 所绘制文字的颜色为灰色
        canvas.create_text(160, 140,  # 使用create_text方法在坐标（160是横坐标，60是纵坐标）处绘制文字
                           text='选择PING呀',  # 所绘制文字的内容
                           fill='blue')  # 所绘制文字的颜色为灰色
        canvas.pack()  # 将Canvas添加到主窗口
#调用图标和背景
bg = ico()

def menu_get_gw():
    """
    获取网关地址
    :return: 返回网关数组
    """
    get = apply()
    sum = int(get.get_count())
    gw = []
    for g_id in range(sum):
        get_g = get.get_gw(nic_id=g_id)
        if get_g:
            gw.append(get_g[0])
    return gw

#打开网页
def visit(url, name=None):
    import webbrowser
    webbrowser.open(url)
    logger.info(f'访问--->[ {name} ]')

#执行终端命令
def too(title, cmd, operation='n'):
    try:
        # file = 'info.ini'
        # info = popen(cmd).read()
        if operation == 'y':
            cmd = 'start cmd /k ' + cmd
            system(cmd)
        else:
            system(cmd)
            messagebox.showinfo(title=title, message='成功')
        logger.info(f'{title}:成功')
    except IOError:
        messagebox.showerror(title=title, message='失败')
        logger.error(f'{title}:失败')
def status_check(status,name=None):
    if int(status) > 3 or int(status) < 0:
        messagebox.showerror(title='权限不足', message='请使用管理员身份重新运行此程序')
        logger.error(f'{name}  配置失败,请检查权限')
        Windows.quit()
    else:
        logger.info(f'[ {name} ]配置成功')

#菜单添加
class add_menu:
    def __init__(self):
        # 新建一个菜单选项
        self.add_menu = Menu(Windows)
        # 新建[文件]菜单
        Windows.config(menu=self.add_menu)
        label = Label(Windows, text="")
        label.pack()
    def tools(self, name):
        tools = Menu(self.add_menu, tearoff=False)
        tools.add_separator()
        tools.add_command(label='网卡适配器', command=lambda: system('control Ncpa.cpl users'))
        tools.add_command(label='查看IP信息', command=lambda: too(title='IP信息', cmd='ipconfig', operation='y'))
        tools.add_command(label='查看路由信息', command=lambda: too(title='路由信息', cmd='route print', operation='y'))
        tools.add_command(label='清除DNS缓存', command=lambda: too(title='清除DNS缓存', cmd='ipconfig /flushdns'))
        tools.add_command(label='查看DNS信息', command=lambda: too(title='查看DNS信息', cmd='ipconfig /displaydns', operation='y'))
        # tools.add_command(label='查看当前网卡信息', command=lambda: too(title='查看当前网卡信息', cmd='ipconfig /showclassid', operation='y' ))
        self.add_menu.add_cascade(label=name, menu=tools)
        logger.info(f'菜单[ {name} ]更新')
    def pr(self, name):
        config = Menu(self.add_menu, tearoff=False)
        config.add_separator()
        config.add_command(label='修改方案', command=lambda: startfile(pr_file))
        config.add_command(label='修改ping', command=lambda: startfile(ping_file))
        config.add_command(label='刷新方案', command=lambda: init.check(file=pr_file, name='刷新方案', mode='update'))
        config.add_command(label='刷新ping', command=lambda: init.check(file=ping_file, name='刷新ping', mode='update'))
        config.add_command(label='初始化', command=lambda: init.check(file=pr_file, name='初始化', mode='init'))
        config.add_command(label='颜色单词对照', command=lambda :visit(url='https://www.5tu.cn/colors/yansezhongwenming.html'))
        self.add_menu.add_cascade(label=name, menu=config)
        logger.info(f'菜单[ {name} ]更新')
    def file(self, name):
        init_file = init_config()
        file = Menu(self.add_menu, tearoff=False)
        file.add_separator()
        file.add_command(label='打开配置文件目录', command=lambda: startfile(config_dir))
        file.add_command(label='查看程序运行日志', command=lambda: startfile(log_file))
        file.add_command(label='清空日志记录', command=lambda: init_file.logs())
        file.add_command(label='退出程序', command=Windows.quit)
        self.add_menu.add_cascade(label=name, menu=file)
        logger.info(f'菜单[ {name} ]更新')
    def about(self, name):
        """
        这是设置“关于”的菜单
        :param name: 菜单名称
        :return: 无
        """
        about = Menu(self.add_menu, tearoff=False)
        about.add_separator()

        # lambda是为了不让菜单自动触发(command不允许传入参数，否则自动触发），来自博客：https://blog.csdn.net/guge907/article/details/23291763
        about.add_command(label='下载更新', command=lambda: visit(url='https://gitee.com/faith01238/IP/releases'))
        about.add_command(label='关于作者', command=lambda: visit(url='https://www.toutiao.com/c/user/token/MS4wLjABAAAAhkfCgYOJBcLeeCmKBkqlgADR-D_woot1lAXGJFnkEnE/'))
        self.add_menu.add_cascade(label=name, menu=about)
        logger.info(f'菜单[ {name} ]更新')
class apply():
    def __init__(self, nic_id=1):
        """
        初始化一个网卡实例
        :param nic_id:输入一个网卡ID(1是第一个，所以实际值需要： ID + 1 )
        """
        self.nic_id = int(nic_id)
        self.wmiService = WMI()
        self.colNicConfigs = self.wmiService.Win32_NetworkAdapterConfiguration(IPEnabled=True)
        self.nic = self.colNicConfigs[self.nic_id]
    def get_count(self):
        """
        获取网卡数量
        :return: 返回网卡数量(整型)
        """
        return len(self.colNicConfigs)
    def get_gw(self,nic_id):
        """
        返回选择的网卡网关
        :return:
        """
        gw = self.colNicConfigs[nic_id].DefaultIPGateway
        return gw
    def get_ip(self,id):
        """
        返回特定ID网卡的IP
        :param id: 网卡ID
        :return: 该网卡的IP
        """
        nic = self.colNicConfigs[int(id)]
        IP = nic.IPAddress
        return IP
    def get_list(self):
        """
        返回网卡名称（硬件)列表
        :return: 网卡名称列表(数组)
        """
        nic_list = []
        for i in range(int(len(self.colNicConfigs))):
            nic = [self.colNicConfigs[i].Description]
            nic_list.append(nic[0])
        return nic_list
    def get_name(self,nic_id):
        """
        通过特定ID查询网卡名称
        :param nic_id: 网卡ID
        :return: 网卡名称
        """
        nic = self.colNicConfigs[int(nic_id)]
        return nic.Description
    def IP(self, IP, MASK):
        """
        这是设置IP的功能
        :param IP: 需要设置的IP地址
        :param MASK: 子网掩码
        :return: 0是成功，1是失败
        """
        status = self.nic.EnableStatic(IP, MASK)
        status_check(status=status[0], name='IP配置')
        return status[0]
    def GW(self, GW, GatewayCostMetric=None):
        """
        这是设置网关的功能
        :param GW: 需要设置的网关地址
        :param GatewayCostMetric: 网络优先级
        :return: 反正状态值
        """
        if GatewayCostMetric:
            status = self.nic.SetGateways(DefaultIPGateway=GW, GatewayCostMetric=GatewayCostMetric)
        else:
            status = self.nic.SetGateways(DefaultIPGateway=GW)
        status_check(status=status[0], name='网关配置')
        return status[0]
    def DNS(self,DNS):
        """
        这是设置DNS的功能
        :param DNS: 传入一个DNS列表，例如: [ '114.114.114.114', '8.8.8.8' ]
        :return: 返回配置状态
        """
        status = self.nic.SetDNSServerSearchOrder(DNSServerSearchOrder=DNS)
        logger.info(f'添加DNS: {DNS}')
        status_check(status=status[0], name='DNS配置')
        return status[0]
    def get_info(self,id=None):
        """
        通过传入一个网卡ID进行获取该网卡的网络信息，通过字典的方式返回数据,使用for遍历字典即可打印相关信息
        :param id: 网卡ID
        :return: 字典信息
        """
        if not id:
            id = self.nic_id
        else:
            if not int(id):
                id = self.nic_id
        list = {'ID: ': id}
        list.update({'网卡名称: ': self.colNicConfigs[id].Description})
        list.update({'IPV4: ': self.colNicConfigs[id].IPAddress[0]})
        list.update({'IPV6: ': self.colNicConfigs[id].IPAddress[1]})
        list.update({'DNS1 IP:': self.colNicConfigs[id].DNSServerSearchOrder[0]})
        list.update({'DNS2 IP:': self.colNicConfigs[id].DNSServerSearchOrder[1]})
        list.update({'子网掩码:': self.colNicConfigs[id].IPSubnet[0]})
        if self.colNicConfigs[id].DefaultIPGateway:
            list.update({'默认网关: ': self.colNicConfigs[id].DefaultIPGateway[0]})
        print(self.nic_id)
        return list
    def check(self, IP='1',GW='1', DNS='1'):
        """
        传入设置的IP进行比较选择的网卡IP是否一致
        :param IP: 需要设置的IP
        :return: 0是成功，404是失败
        """
        if str(self.colNicConfigs[self.nic_id].IPAddress[0]) == str(IP):
            logger.info(f'IP：[ {IP} ]匹配成功')
        else:
            if IP != str(1):
                messagebox.showerror(title='IP', message='匹配失败')
        if self.colNicConfigs[self.nic_id].DNSServerSearchOrder == DNS:
            logger.info(f'DNS：[ {DNS} ]匹配成功')
        else:
            if DNS != str(1):
                messagebox.showerror(title='DNS', message='匹配失败')
        if str(self.colNicConfigs[self.nic_id].DefaultIPGateway) == str(GW):
            logger.info(f'网关：[ {GW} ]匹配成功')
        else:
            if GW != str(1):
                messagebox.showerror(title='网关', message='匹配失败')
    def dhcp(self):
        self.nic.EnableDHCP()
class add_Combobox():
    def __init__(self):
        self.pr_Comboboxs = ttk.Combobox(Windows, width=50, textvariable=StringVar)
        # 放置
        self.pr_Comboboxs.pack()
        self.pr_Comboboxs.place(x=200, y=52)  # 位置参数



        ##添加网卡

        self.card_Comboboxs = ttk.Combobox(Windows, width=50, textvariable=StringVar)
        # 放置
        self.card_Comboboxs.pack()
        self.card_Comboboxs.place(x=200, y=10)  # 位置参数



        #模式
        self.mode_Comboboxs = ttk.Combobox(Windows, width=50, textvariable=StringVar)
        # 放置
        self.mode_Comboboxs.pack()
        self.mode_Comboboxs.place(x=200, y=90)  # 位置参数
        self.mode_Comboboxs['value'] = ['1-更改全部(所有参数)', '2-更改DNS(不更改IP)', '3-更改IP(不更改DNS)']
        self.mode_Comboboxs.current(0)

        #ping
        self.ping_Comboboxs = ttk.Combobox(Windows, width=50, textvariable=StringVar)
        self.ping_Comboboxs.pack()
        self.ping_Comboboxs.place(x=200, y=130)  # 位置参数
    def add_ping(self):
        list = ['谷歌: google.com', 'DNS: 114.114.114.114']

        #获取配置文件
        ping = configparser.ConfigParser()
        ping.read(ping_file, encoding="utf-8")
        for sec in ping.sections():
            add = f"{ping.get(sec,'name')} : {ping.get(sec,'IPADDR')}"
            list.append(add)
        #获取网关
        gw_list = menu_get_gw()
        for gw in gw_list:
            list.append(f'网关: {gw}')

        self.ping_Comboboxs['value'] = list
        self.ping_Comboboxs.current(0)

    def get_ping(self):
        """
        返回选择的ping选项
        :return: ping选项
        """
        return self.ping_Comboboxs.get()
    def get_pr_list(self):
        pr_get = configparser.ConfigParser()
        pr_get.read(pr_file, encoding="utf-8")
        list = []
        for i in pr_get.items():
            sec = i[0]
            if not sec == 'DEFAULT':
                name = pr_get.get(sec, 'name')
                IP = pr_get.get(sec, 'IP')
                list.append(f'{sec}--{name} ->->-> [ {IP} ]')
        return list
    def pr_update(self):
        """
        获取最新方案下拉选择框菜单内容
        :return: 返回最新方案菜单内容
        """
        pr_get = configparser.ConfigParser()
        pr_get.read(pr_file, encoding="utf-8")
        self.pr_list = []
        for i in pr_get.items():
            sec = i[0]
            if not sec == 'DEFAULT':
                name = pr_get.get(sec, 'name')
                IP = pr_get.get(sec, 'IP')
                self.pr_list.append(f'{sec}--{name} ->->-> [ {IP} ]')
        self.pr_Comboboxs = ttk.Combobox(Windows, width=50, textvariable=StringVar)
        # 放置
        self.pr_Comboboxs.pack()
        self.pr_Comboboxs.place(x=200, y=52)  # 位置参数
        self.pr_Comboboxs['value'] = self.pr_list
        self.pr_Comboboxs.current(0)

        return self.pr_Comboboxs.get()
    def add_pr(self):
        ##添加方案
        pr_get = configparser.ConfigParser()
        pr_get.read(pr_file, encoding="utf-8")
        pr_list = []
        for i in pr_get.items():
            sec = i[0]
            if not sec == 'DEFAULT':
                name = pr_get.get(sec, 'name')
                IP = pr_get.get(sec, 'IP')
                pr_list.append(f'{sec}--{name} ->->-> [ {IP} ]')
        # 创建
        self.pr_Comboboxs['value'] = pr_list
        self.pr_Comboboxs.current(0)
    def card_update(self):
        # 添加下拉框
        # 创建
        self.card_Comboboxs = ttk.Combobox(Windows, width=50, textvariable=StringVar)
        # 放置
        self.card_Comboboxs.pack()
        self.card_Comboboxs.place(x=200, y=10)  # 位置参数
        self.card_Comboboxs['value'] = self.card_list
        self.card_Comboboxs.current(0)
        return self.card_Comboboxs.get()
    def add_card(self):
        get = apply()
        self.card_list = []
        for i in range(get.get_count()):
            name = get.get_name(nic_id=i)
            IP = get.get_ip(id=i)
            add = f"{i}--{name} ->{IP[0]}"
            ##限制网卡字符串数量，当大于60的时候则不显示该网卡的IP
            if len(add) > 60:
                add = f"{i}--{name}"
            self.card_list.append(add)
        # 创建
        self.card_Comboboxs['value'] = self.card_list
        self.card_Comboboxs.current(0)
    def get_pr(self):
        '''
        返回选择的方案
        :return: 方案内容
        '''
        return self.pr_Comboboxs.get()
    def get_card(self):
        '''
        返回选择的网卡
        :return: 网卡内容
        '''
        return self.card_Comboboxs.get()
    def get_mode(self):
        '''
        返回选择的模式
        :return: 选择的内容
        '''
        return self.mode_Comboboxs.get()


# 开始进行更改
def switch(sec):

    #获取网卡信息
    card = add_com.get_card()

    nic_id = str(card).split('--')[0]
    nic_name = str(card).split('--')[1].split('->')[0]
    logger.info(f'当前函数:[ switch ],获取到的网卡ID是: [ {nic_id} ]')
    logger.info(f'当前函数:[ switch ],获取到的网卡name是: [ {nic_name} ]')

    #获取方案信息
    all_info = add_com.get_pr()
    print(all_info)
    pr_id = all_info.split('--')[0]
    pr_name = all_info.split('--')[1]
    get_info = read_ini(file=pr_file, section=pr_id)

    pr_new_ip = get_info.gets(name='IP')
    pr_new_mask = get_info.gets(name='NETMASK')
    pr_new_gw = get_info.gets(name='GATEWAY')
    gw_gm = get_info.gets(name='GatewayCostMetric')
    DNS1 = get_info.gets(name='DNS1')
    DNS2 = get_info.gets(name='DNS2')


    logger.info(f'当前函数: [switch],获取到的名称是: [ {pr_name} ]')
    logger.info(f'当前函数: [switch],获取到的方案是: [ {pr_id} ]')
    logger.info(f'当前函数: [switch],获取到的方案IP是: [ {pr_new_ip} ]')
    logger.info(f'当前函数: [switch],获取到的方案掩码是: [ {pr_new_mask} ]')
    logger.info(f'当前函数: [switch],获取到的方案网关是: [ {pr_new_gw} ]')
    logger.info(f'当前函数: [switch],获取到的方案网关优先级是: [ {gw_gm} ]')
    logger.info(f'当前函数: [switch],获取到的方案DNS1是: [ {DNS1} ]')
    logger.info(f'当前函数: [switch],获取到的方案DNS2是: [ {DNS2} ]')


    #获取模式ID
    mode_info = add_com.get_mode()
    mode_id = str(mode_info).split('-')[0]
    logger.info(f'当前获取到的模式ID是: [ {mode_id} ]')
    #
    config = apply(nic_id=int(nic_id))
    config.dhcp()
    if sec == 'dhcp':
        try:
            logger.info(f'对[ {nic_name} ]配置DHCP模式成功')
            messagebox.showinfo(title='DHCP启用', message='启用成功')
        except:
            logger.error(f'对[ {nic_name} ]配置DHCP模式失败')
            messagebox.showinfo(title='DHCP启用', message='启用失败')
    elif sec == 'start':
        if int(mode_id) == int(1) or int(mode_id) == int(3):
            logger.info('正在修改IP...')
            # 设置IP
            config.IP(IP=[pr_new_ip], MASK=[pr_new_mask])

            # 设置网关
            if pr_new_gw:
                logger.info(f'正在修改网关: [ {pr_new_gw} ]...')
                if int(gw_gm):
                    config.GW(GW=[pr_new_gw], GatewayCostMetric=[gw_gm])
                else:
                    config.GW(GW=[pr_new_gw])

        if int(mode_id) == int(1) or int(mode_id) == int(2):
            logger.info('正在修改DNS...')
            # 设置DNS
            DNS = []
            if DNS1:
                DNS.append(DNS1)
            if DNS2:
                DNS.append(DNS2)
            if DNS:
                config.DNS(DNS=DNS)
#定义按钮
class Buttons():
    def __init__(self, windows):
        self.windows = windows
        self.config_pr = configparser.ConfigParser()
        self.config_pr.read(pr_file, encoding="utf-8")
        """
        下面是按钮的实现
        activebackground  当鼠标放上去时，按钮的背景色
        bd  按钮边框的大小，默认为 2 个像素
        bg  按钮的背景色
        height 按钮的高度
        image  按钮上要显示的图片
        width  按钮的宽度，如未设置此项，其大小以适应按钮的内容（文本或图片的大小）
        """
    def fun(self):
        width, height, y = 10, 1, 140
        conf = read_ini(file=pr_file, section='Intranet')

        # ####DHCP按钮
        bt_dhcp = Button(self.windows, text='DHCP模式', width=width, height=height,
                         font=('Fixdsys', 14, 'bold'), activebackground='blue',
                         fg='Lavender', #字体背景
                         bg='Silver', #按钮背景
                         command=lambda :switch(sec='dhcp')
                         )
        bt_dhcp.pack()  # 加载到窗体
        bt_dhcp.place(x=int(20), y=int(210))  # 设置坐标（以程序界面大小为基准)
        # ####按钮
        button1 = Button(self.windows, text='开始PING',
                         width=10, #按钮框的宽度
                         height=height, #按钮框的长度
                         font=('Fixdsys', 14, 'bold'), #字体、大小、背景
                         activebackground='blue', #按钮框背景
                         fg='Lavender', #字体背景
                         bg='Silver', #按钮背景
                         command=lambda :too(title=f'PING', cmd=f"ping {str(add_com.get_ping()).split(':')[1]}", operation='y')
                         )
        button1.pack()  # 加载到窗体
        button1.place(x=int(250), y=int(210))  # 设置坐标（以程序界面大小为基准)


        # ####按钮
        button1 = Button(self.windows, text='开始更改',
                         width=10, #按钮框的宽度
                         height=height, #按钮框的长度
                         font=('Fixdsys', 14, 'bold'), #字体、大小、背景
                         activebackground='blue', #按钮框背景
                         fg='Lavender', #字体背景
                         bg='Silver', #按钮背景
                         command=lambda :switch(sec='start')
                         )
        button1.pack()  # 加载到窗体
        button1.place(x=int(470), y=int(210))  # 设置坐标（以程序界面大小为基准)

    def bt(self, name, width, height, font=('Fixdsys', 14, 'bold'), activebackground='blue', x=300, y=140):
        get_id = Button(self.windows, text=name, width=width, height=height, font=font, activebackground=activebackground)
        get_id.pack()
        get_id.place(x=int(x), y=int(y))
        return id

    def parts(self, name, url, x, y):
        go = Button(self.windows, text=name,
                    width=10, height=1, font=("楷体", 14, 'bold'),
                    activebackground='blue',
                    fg='blue',
                    bg='RosyBrown',
                    command=lambda :visit(url=url, name=name))
        go.pack()
        go.place(x=int(x), y=int(y))

    def cmd(self, cmd='ping baidu.com', text='装X模式', x=int(20), y=int(160),
            width=10, height=1, font=('Fixdsys', 14, 'bold')):
        bt = Button(self.windows, text=text, width=width, height=height, font=font, fg='blue',
                    bg='RosyBrown', command=lambda :system(f'start cmd /k {cmd}'))
        bt.pack()
        bt.place(x=x, y=y)

#依次添加按钮
def add_bt():
    ##添加按钮
    bt = Buttons(windows=Windows)
    #添加功能按钮
    bt.fun()
    # bt.bt_enable(text='禁用网卡', x=int(170), y=int(210), width=int(10), height=int(1), mode='disabled')
    bt.parts(name='访问百度', url='https://baidu.com/', x=20, y=260)
    bt.parts(name='百度开发', url='https://kaifa.baidu.com/', x=170, y=260)
    bt.parts(name='今日头条', url='https://www.toutiao.com/c/user/token/MS4wLjABAAAAhkfCgYOJBcLeeCmKBkqlgADR-D_woot1lAXGJFnkEnE/', x=320, y=260)
    bt.parts(name='CSDN', url='https://blog.csdn.net/qq_36154886/article/details/109211712', x=470, y=260)


    bt.parts(name='博客园', url='https://www.cnblogs.com/liuyi778/p/12846511.html', x=20, y=300)
    bt.parts(name='Bug反馈', url='https://jq.qq.com/?_wv=1027&k=vC8XNViw', x=170, y=300)
    bt.parts(name='赏点', url='https://gitee.com/faith01238/IP#5%E8%B5%8F%E7%82%B9', x=320, y=300)
    bt.parts(name='使用教程', url='https://www.toutiao.com/i6923054987920556558', x=470, y=300)



    # bt.cmd(cmd=cmd, text=ping.get('ping', 'name'), y=int(160), x=int(260))

#依次添加菜单
def update_menu():
    # 添加菜单
    init_menu = add_menu()

    init_menu.file(name='文件')

    init_menu.pr(name='设置')


    init_menu.tools(name='工具')


    init_menu.about(name='关于')

#依次添加组合框

add_bt()
update_menu()
add_com = add_Combobox()
add_com.add_pr()
add_com.add_ping()
add_com.add_card()


Windows.mainloop()